Purpose:
Runs survival analysis models using splicing cluster assignment as a predictor
Uses a wrapper function (survival_analysis) from utils
folder.
Load packages, set directory paths and call setup script
library(tidyverse)
library(survival)
library(ggpubr)
library(ggplot2)
library(patchwork)
root_dir <- rprojroot::find_root(rprojroot::has_dir(".git"))
data_dir <- file.path(root_dir, "data")
analysis_dir <- file.path(root_dir, "analyses", "survival")
input_dir <- file.path(analysis_dir, "results")
results_dir <- file.path(analysis_dir, "results")
plot_dir <- file.path(analysis_dir, "plots")
# If the input and results directories do not exist, create it
if (!dir.exists(results_dir)) {
dir.create(results_dir, recursive = TRUE)
}
source(file.path(analysis_dir, "util", "survival_models.R"))
Set metadata and cluster assignment file paths
metadata_file <- file.path(input_dir, "splicing_indices_with_survival.tsv")
cluster_file <- file.path(root_dir, "analyses",
"sample-psi-clustering", "results",
"sample-cluster-metadata-top-5000-events-stranded.tsv")
Wrangle data Add cluster assignment to metadata and
define column lgg_group (LGG or non_LGG)
metadata <- read_tsv(metadata_file)
Rows: 684 Columns: 22
── Column specification ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: "\t"
chr (11): Kids_First_Biospecimen_ID, Histology, Kids_First_Participant_ID, molecular_subtype, extent_of_tumor_resection, EFS_event_type, OS_status, plo...
dbl (11): Total, AS_neg, AS_pos, AS_total, SI_Total, EFS_days, OS_days, age_at_diagnosis_days, age_at_diagnosis, OS_years, EFS_years
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
clusters <- read_tsv(cluster_file) %>%
dplyr::rename(Kids_First_Biospecimen_ID = sample_id)
Rows: 729 Columns: 8
── Column specification ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: "\t"
chr (6): sample_id, plot_group, plot_group_hex, RNA_library, molecular_subtype, plot_group_n
dbl (2): cluster, group_n
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# how many clusters?
n_clust <- length(unique(clusters$cluster))
metadata <- metadata %>%
right_join(clusters %>% dplyr::select(Kids_First_Biospecimen_ID,
cluster)) %>%
dplyr::mutate(cluster = glue::glue("Cluster {cluster}")) %>%
dplyr::mutate(cluster = fct_relevel(cluster,paste0("Cluster ", 1:n_clust))) %>%
dplyr::mutate(lgg_group = case_when(
plot_group == "Low-grade glioma" ~ "LGG",
TRUE ~ "non-LGG"
))
Joining with `by = join_by(Kids_First_Biospecimen_ID)`
Define colors for clusters
# define colors for clusters
cluster_cols <- c("#B2DF8A","#E31A1C","#33A02C","#A6CEE3","#FB9A99","#FDBF6F",
"#CAB2D6","#FFFF99","#1F78B4","#B15928","#6A3D9A")
names(cluster_cols) <- glue::glue("Cluster {1:length(cluster_cols)}")
Generate log rank OS and EFS models with cluster assignment as predictor
# Generate kaplan meier survival models for OS and EFS, and save outputs
kap_os <- survival_analysis(
metadata = metadata,
ind_var = "cluster",
test = "kap.meier",
metadata_sample_col = "Kids_First_Biospecimen_ID",
days_col = "OS_days",
status_col = "OS_status"
)
Testing model: survival::Surv(OS_days, OS_status) ~ cluster with kap.meier
readr::write_rds(kap_os,
file.path(results_dir, "logrank_OS_cluster_assignment.RDS"))
kap_efs <- survival_analysis(
metadata = metadata,
ind_var = "cluster",
test = "kap.meier",
metadata_sample_col = "Kids_First_Biospecimen_ID",
days_col = "EFS_days",
status_col = "EFS_status"
)
Testing model: survival::Surv(EFS_days, EFS_status) ~ cluster with kap.meier
readr::write_rds(kap_efs,
file.path(results_dir, "logrankEFS_cluster_assignment.RDS"))
Generate KM plots
km_os_plot <- plotKM(model = kap_os,
variable = "cluster",
combined = F,
title = "cluster",
palette = cluster_cols)
Ignoring unknown labels:
• fill : ""
Warning: No shared levels found between `names(values)` of the manual scale and the data's fill values.
ggsave(file.path(plot_dir, "km_OS_cluster_assignment.pdf"),
km_os_plot,
width = 10, height = 8, units = "in",
device = "pdf")
Ignoring unknown labels:
• fill : ""
Warning: No shared levels found between `names(values)` of the manual scale and the data's fill values.
Ignoring unknown labels:
• colour : ""
Warning: No shared levels found between `names(values)` of the manual scale and the data's colour values.
Warning: No shared levels found between `names(values)` of the manual scale and the data's fill values.
km_efs_plot <- plotKM(model = kap_efs,
variable = "cluster",
combined = F,
title = "cluster",
palette = cluster_cols)
Ignoring unknown labels:
• fill : ""
Warning: No shared levels found between `names(values)` of the manual scale and the data's fill values.
ggsave(file.path(plot_dir, "km_EFS_cluster_assignment.pdf"),
km_efs_plot,
width = 10, height = 8, units = "in",
device = "pdf")
Ignoring unknown labels:
• fill : ""
Warning: No shared levels found between `names(values)` of the manual scale and the data's fill values.
Ignoring unknown labels:
• colour : ""
Warning: No shared levels found between `names(values)` of the manual scale and the data's colour values.
Warning: No shared levels found between `names(values)` of the manual scale and the data's fill values.
Generate coxph models including extent of tumor resection, lgg group, and cluster assignment as covariates
add_model_os <- fit_save_model(metadata[!metadata$extent_of_tumor_resection %in% c("Not Reported", "Unavailable"),],
terms = "extent_of_tumor_resection+lgg_group+cluster+age_at_diagnosis_days",
file.path(results_dir, "cox_OS_additive_terms_resection_lgg_group_cluster.RDS"),
"multivariate",
years_col = "OS_years",
status_col = "OS_status")
forest_os <- plotForest(readRDS(file.path(results_dir, "cox_OS_additive_terms_resection_lgg_group_cluster.RDS")))
`height` was translated to `width`.
Warning: Removed 3 rows containing missing values or values outside the scale range (`geom_text()`).
forest_os
ggsave(file.path(plot_dir, "forest_add_OS_resection_lgg_group_cluster_assignment.pdf"),
forest_os,
width = 10, height = 6, units = "in",
device = "pdf")
add_model_efs <- fit_save_model(metadata[!metadata$extent_of_tumor_resection %in% c("Not Reported", "Unavailable"),],
terms = "extent_of_tumor_resection+lgg_group+cluster+age_at_diagnosis_days",
file.path(results_dir, "cox_EFS_additive_terms_resection_lgg_group_cluster.RDS"),
"multivariate",
years_col = "EFS_years",
status_col = "EFS_status")
forest_efs <- plotForest(readRDS(file.path(results_dir, "cox_EFS_additive_terms_resection_lgg_group_cluster.RDS")))
`height` was translated to `width`.
Warning: Removed 3 rows containing missing values or values outside the scale range (`geom_text()`).
forest_efs
ggsave(file.path(plot_dir, "forest_add_EFS_resection_lgg_group_cluster_assignment.pdf"),
forest_efs,
width = 10, height = 6, units = "in",
device = "pdf")
Generate coxph models including extent of tumor resection, plot group, and cluster assignment as covariates
add_model_os <- fit_save_model(metadata %>%
filter(!extent_of_tumor_resection %in% c("Not Reported", "Unavailable")) %>%
mutate(plot_group = forcats::fct_relevel(plot_group, "Low-grade glioma", after = 0)),
terms = "extent_of_tumor_resection+plot_group+cluster+age_at_diagnosis_days",
file.path(results_dir, "cox_OS_additive_terms_resection_plot_group_cluster.RDS"),
"multivariate",
years_col = "OS_years",
status_col = "OS_status")
Warning in coxph.fit(X, Y, istrat, offset, init, control, weights = weights, :
Ran out of iterations and did not converge
forest_os <- plotForest(readRDS(file.path(results_dir, "cox_OS_additive_terms_resection_plot_group_cluster.RDS")))
`height` was translated to `width`.
Warning: Removed 3 rows containing missing values or values outside the scale range (`geom_text()`).
forest_os
ggsave(file.path(plot_dir, "forest_add_OS_resection_plot_group_cluster_assignment.pdf"),
forest_os,
width = 10, height = 6, units = "in",
device = "pdf")
add_model_efs <- fit_save_model(metadata %>%
filter(!extent_of_tumor_resection %in% c("Not Reported", "Unavailable")) %>%
mutate(plot_group = forcats::fct_relevel(plot_group, "Low-grade glioma", after = 0)),
terms = "extent_of_tumor_resection+plot_group+cluster+age_at_diagnosis_days",
file.path(results_dir, "cox_EFS_additive_terms_resection_plot_group_cluster.RDS"),
"multivariate",
years_col = "EFS_years",
status_col = "EFS_status")
Warning in coxph.fit(X, Y, istrat, offset, init, control, weights = weights, :
Loglik converged before variable 8 ; coefficient may be infinite.
forest_efs <- plotForest(readRDS(file.path(results_dir, "cox_EFS_additive_terms_resection_plot_group_cluster.RDS")))
`height` was translated to `width`.
Warning: Removed 3 rows containing missing values or values outside the scale range (`geom_text()`).
forest_efs
ggsave(file.path(plot_dir, "forest_add_EFS_resection_plot_group_cluster_assignment.pdf"),
forest_efs,
width = 10, height = 6, units = "in",
device = "pdf")
Generate interaction coxph models including extent of tumor resection, plot group, and cluster assignment as covariates
add_model_os <- fit_save_model(metadata %>%
filter(!extent_of_tumor_resection %in% c("Not Reported", "Unavailable")) %>%
mutate(plot_group = forcats::fct_relevel(plot_group, "Low-grade glioma", after = 0)),
terms = "extent_of_tumor_resection+plot_group*cluster+age_at_diagnosis_days",
file.path(results_dir, "cox_OS_int_terms_resection_plot_group_cluster.RDS"),
"multivariate",
years_col = "OS_years",
status_col = "OS_status")
Warning in coxph.fit(X, Y, istrat, offset, init, control, weights = weights, :
Ran out of iterations and did not converge
forest_os <- plotForest(readRDS(file.path(results_dir, "cox_OS_int_terms_resection_plot_group_cluster.RDS")))
Warning in scale_x_log10(labels = function(x) format(x, scientific = FALSE)) :
log-10 transformation introduced infinite values.
`height` was translated to `width`.
Warning: Removed 3 rows containing missing values or values outside the scale range (`geom_text()`).
forest_os
ggsave(file.path(plot_dir, "forest_int_OS_resection_plot_group_cluster_assignment.pdf"),
forest_os,
width = 15, height = 15, units = "in",
device = "pdf")
add_model_efs <- fit_save_model(metadata %>%
filter(!extent_of_tumor_resection %in% c("Not Reported", "Unavailable")) %>%
mutate(plot_group = forcats::fct_relevel(plot_group, "Low-grade glioma", after = 0)),
terms = "extent_of_tumor_resection+plot_group*cluster+age_at_diagnosis_days",
file.path(results_dir, "cox_EFS_int_terms_resection_plot_group_cluster.RDS"),
"multivariate",
years_col = "EFS_years",
status_col = "EFS_status")
Warning in coxph.fit(X, Y, istrat, offset, init, control, weights = weights, :
Ran out of iterations and did not converge
forest_efs <- plotForest(readRDS(file.path(results_dir, "cox_EFS_int_terms_resection_plot_group_cluster.RDS")))
`height` was translated to `width`.
Warning: Removed 3 rows containing missing values or values outside the scale range (`geom_text()`).
forest_efs
ggsave(file.path(plot_dir, "forest_int_EFS_resection_plot_group_cluster_assignment.pdf"),
forest_efs,
width = 15, height = 15, units = "in",
device = "pdf")
Subset metadata for LGG, and only include clusters with
>= 10 samples
lgg <- metadata %>%
dplyr::filter(plot_group == "Low-grade glioma") %>%
dplyr::mutate(cluster = factor(cluster)) %>%
dplyr::mutate(mol_sub_group = fct_relevel(mol_sub_group, c("Wildtype", "BRAF V600E", "BRAF fusion",
"Other alteration", "SEGA"
)))
retain_clusters_lgg <- lgg %>%
count(cluster) %>%
filter(n >= 10) %>%
pull(cluster)
lgg <- lgg %>%
filter(cluster %in% retain_clusters_lgg) %>%
dplyr::mutate(cluster = factor(cluster))
Generate log rank OS and EFS models with cluster assignment as predictor
# Generate kaplan meier survival models for OS and EFS, and save outputs
lgg_kap_os <- survival_analysis(
metadata = lgg,
ind_var = "cluster",
test = "kap.meier",
metadata_sample_col = "Kids_First_Biospecimen_ID",
days_col = "OS_days",
status_col = "OS_status"
)
Testing model: survival::Surv(OS_days, OS_status) ~ cluster with kap.meier
readr::write_rds(lgg_kap_os,
file.path(results_dir, "logrank_lgg_OS_cluster_assignment.RDS"))
lgg_kap_efs <- survival_analysis(
metadata = lgg,
ind_var = "cluster",
test = "kap.meier",
metadata_sample_col = "Kids_First_Biospecimen_ID",
days_col = "EFS_days",
status_col = "EFS_status"
)
Testing model: survival::Surv(EFS_days, EFS_status) ~ cluster with kap.meier
readr::write_rds(lgg_kap_efs,
file.path(results_dir, "logrank_lgg_EFS_cluster_assignment.RDS"))
Generate LGG KM plots
km_lgg_os_plot <- plotKM(model = lgg_kap_os,
variable = "cluster",
combined = F,
title = "cluster",
palette = cluster_cols[names(cluster_cols) %in% retain_clusters_lgg])
Ignoring unknown labels:
• fill : ""
Warning: No shared levels found between `names(values)` of the manual scale and the data's fill values.
ggsave(file.path(plot_dir, "km_lgg_OS_cluster_assignment.pdf"),
km_lgg_os_plot,
width = 10, height = 6, units = "in",
device = "pdf")
Ignoring unknown labels:
• fill : ""
Warning: No shared levels found between `names(values)` of the manual scale and the data's fill values.
Ignoring unknown labels:
• colour : ""
Warning: No shared levels found between `names(values)` of the manual scale and the data's colour values.
Warning: No shared levels found between `names(values)` of the manual scale and the data's fill values.
km_lgg_efs_plot <- plotKM(model = lgg_kap_efs,
variable = "cluster",
combined = F,
title = "cluster",
palette = cluster_cols[names(cluster_cols) %in% retain_clusters_lgg])
Ignoring unknown labels:
• fill : ""
Warning: No shared levels found between `names(values)` of the manual scale and the data's fill values.
ggsave(file.path(plot_dir, "km_lgg_EFS_cluster_assignment.pdf"),
km_lgg_efs_plot,
width = 10, height = 6, units = "in",
device = "pdf")
Ignoring unknown labels:
• fill : ""
Warning: No shared levels found between `names(values)` of the manual scale and the data's fill values.
Ignoring unknown labels:
• colour : ""
Warning: No shared levels found between `names(values)` of the manual scale and the data's colour values.
Warning: No shared levels found between `names(values)` of the manual scale and the data's fill values.
Generate coxph models including covariates
extent_of_tumor_resection, mol_sub_group, and
cluster, and plot
add_model_lgg_os <- fit_save_model(lgg[!lgg$extent_of_tumor_resection %in% c("Not Reported", "Unavailable"),],
terms = "extent_of_tumor_resection+mol_sub_group+cluster+age_at_diagnosis_days",
file.path(results_dir, "cox_lgg_OS_additive_terms_resection_subtype_cluster.RDS"),
"multivariate",
years_col = "OS_years",
status_col = "OS_status")
Warning in coxph.fit(X, Y, istrat, offset, init, control, weights = weights, :
Ran out of iterations and did not converge
forest_lgg_os <- plotForest(readRDS(file.path(results_dir, "cox_lgg_OS_additive_terms_resection_subtype_cluster.RDS")))
Warning in scale_x_log10(labels = function(x) format(x, scientific = FALSE)) :
log-10 transformation introduced infinite values.
`height` was translated to `width`.
Warning: Removed 3 rows containing missing values or values outside the scale range (`geom_text()`).
forest_lgg_os
ggsave(file.path(plot_dir, "forest_add_OS_LGG_resection_subtype_cluster_assignment.pdf"),
forest_lgg_os,
width = 10, height = 6, units = "in",
device = "pdf")
# identify LGG clusters
lgg_clusters <- metadata %>%
filter(lgg_group == "LGG") %>%
mutate(cluster = as.integer(gsub("cluster", "", cluster))) %>%
pull(cluster) %>%
sort() %>%
unique()
Warning: There was 1 warning in `mutate()`.
ℹ In argument: `cluster = as.integer(gsub("cluster", "", cluster))`.
Caused by warning:
! NAs introduced by coercion
add_model_lgg_efs <- fit_save_model(lgg[!lgg$cluster %in% lgg_clusters & !lgg$extent_of_tumor_resection %in% c("Not Reported", "Unavailable"),],
terms = "extent_of_tumor_resection+mol_sub_group+cluster+age_at_diagnosis_days",
file.path(results_dir, "cox_lgg_EFS_additive_terms_resection_subtype_cluster.RDS"),
"multivariate",
years_col = "EFS_years",
status_col = "EFS_status")
Warning in coxph.fit(X, Y, istrat, offset, init, control, weights = weights, :
Loglik converged before variable 6,7 ; coefficient may be infinite.
forest_lgg_efs <- plotForest(readRDS(file.path(results_dir, "cox_lgg_EFS_additive_terms_resection_subtype_cluster.RDS")))
`height` was translated to `width`.
Warning: Removed 3 rows containing missing values or values outside the scale range (`geom_text()`).
forest_lgg_efs
ggsave(file.path(plot_dir, "forest_add_EFS_LGG_resection_subtype_cluster_assignment.pdf"),
forest_lgg_efs,
width = 10, height = 6, units = "in",
device = "pdf")
Subset metadata for HGG and retain cluster with n >=
10
hgg <- metadata %>%
dplyr::filter(plot_group %in% c("Other high-grade glioma", "Diffuse midline glioma")) %>%
dplyr::mutate(cluster = factor(cluster)) %>%
dplyr::mutate(mol_sub_group = fct_relevel(mol_sub_group, c("HGG, H3 wildtype", "HGG, H3 wildtype, TP53",
"DMG, H3 K28", "DMG, H3 K28, TP53",
"DHG, H3 G35", "DHG, H3 G35, TP53",
"HGG, IDH, TP53", "HGG, PXA", "HGG, PXA, TP53",
"IHG, ALK-altered", "IHG, NTRK-altered",
"IHG, ROS1-altered"
)))
Warning: There was 1 warning in `dplyr::mutate()`.
ℹ In argument: `mol_sub_group = fct_relevel(...)`.
Caused by warning:
! 2 unknown levels in `f`: HGG, PXA, TP53 and IHG, ALK-altered
retain_clusters_hgg <- hgg %>%
count(cluster) %>%
filter(n >= 10) %>%
pull(cluster)
hgg <- hgg %>%
filter(cluster %in% retain_clusters_hgg) %>%
dplyr::mutate(cluster = factor(cluster))
Generate HGG OS and EFS log rank models with cluster as predictor
# Generate kaplan meier survival models for OS and EFS, and save outputs
hgg_kap_os <- survival_analysis(
metadata = hgg,
ind_var = "cluster",
test = "kap.meier",
metadata_sample_col = "Kids_First_Biospecimen_ID",
days_col = "OS_days",
status_col = "OS_status"
)
Testing model: survival::Surv(OS_days, OS_status) ~ cluster with kap.meier
readr::write_rds(hgg_kap_os,
file.path(results_dir, "logrank_hgg_OS_cluster_assignment.RDS"))
hgg_kap_efs <- survival_analysis(
metadata = hgg,
ind_var = "cluster",
test = "kap.meier",
metadata_sample_col = "Kids_First_Biospecimen_ID",
days_col = "EFS_days",
status_col = "EFS_status"
)
Testing model: survival::Surv(EFS_days, EFS_status) ~ cluster with kap.meier
readr::write_rds(hgg_kap_efs,
file.path(results_dir, "logrank_hgg_EFS_cluster_assignment.RDS"))
Generate HGG KM plots
km_hgg_os_plot <- plotKM(model = hgg_kap_os,
variable = "cluster",
combined = F,
title = "cluster",
palette = cluster_cols[names(cluster_cols) %in% retain_clusters_hgg])
Ignoring unknown labels:
• fill : ""
Warning: No shared levels found between `names(values)` of the manual scale and the data's fill values.
ggsave(file.path(plot_dir, "km_hgg_OS_cluster_assignment.pdf"),
km_hgg_os_plot,
width = 10, height = 6, units = "in",
device = "pdf")
Ignoring unknown labels:
• fill : ""
Warning: No shared levels found between `names(values)` of the manual scale and the data's fill values.
Ignoring unknown labels:
• colour : ""
Warning: No shared levels found between `names(values)` of the manual scale and the data's colour values.
Warning: No shared levels found between `names(values)` of the manual scale and the data's fill values.
km_hgg_efs_plot <- plotKM(model = hgg_kap_efs,
variable = "cluster",
combined = F,
title = "cluster",
palette = cluster_cols[names(cluster_cols) %in% retain_clusters_hgg])
Ignoring unknown labels:
• fill : ""
Warning: No shared levels found between `names(values)` of the manual scale and the data's fill values.
ggsave(file.path(plot_dir, "km_hgg_EFS_cluster_assignment.pdf"),
km_hgg_efs_plot,
width = 10, height = 6, units = "in",
device = "pdf")
Ignoring unknown labels:
• fill : ""
Warning: No shared levels found between `names(values)` of the manual scale and the data's fill values.
Ignoring unknown labels:
• colour : ""
Warning: No shared levels found between `names(values)` of the manual scale and the data's colour values.
Warning: No shared levels found between `names(values)` of the manual scale and the data's fill values.
Generate coxph models for HGG including covariates
mol_sub_group and cluster, and plot
add_model_hgg_os <- fit_save_model(hgg,
terms = "mol_sub_group+cluster+age_at_diagnosis_days",
file.path(results_dir, "cox_hgg_OS_additive_terms_subtype_cluster.RDS"),
"multivariate",
years_col = "OS_years",
status_col = "OS_status")
Warning in coxph.fit(X, Y, istrat, offset, init, control, weights = weights, :
Loglik converged before variable 8 ; coefficient may be infinite.
forest_hgg_os <- plotForest(readRDS(file.path(results_dir, "cox_hgg_OS_additive_terms_subtype_cluster.RDS")))
`height` was translated to `width`.
Warning: Removed 2 rows containing missing values or values outside the scale range (`geom_text()`).
forest_hgg_os
ggsave(file.path(plot_dir, "forest_add_OS_HGG_subtype_cluster_assignment.pdf"),
forest_hgg_os,
width = 10, height = 6, units = "in",
device = "pdf")
add_model_hgg_efs <- fit_save_model(hgg,
terms = "mol_sub_group+cluster+age_at_diagnosis_days",
file.path(results_dir, "cox_hgg_EFS_additive_terms_subtype_cluster.RDS"),
"multivariate",
years_col = "EFS_years",
status_col = "EFS_status")
forest_hgg_efs <- plotForest(readRDS(file.path(results_dir, "cox_hgg_EFS_additive_terms_subtype_cluster.RDS")))
`height` was translated to `width`.
Warning: Removed 2 rows containing missing values or values outside the scale range (`geom_text()`).
ggsave(file.path(plot_dir, "forest_add_EFS_HGG_subtype_cluster_assignment.pdf"),
forest_hgg_efs,
width = 10, height = 6, units = "in",
device = "pdf")
Print session info
sessionInfo()
R version 4.4.0 (2024-04-24)
Platform: x86_64-pc-linux-gnu
Running under: Ubuntu 22.04.4 LTS
Matrix products: default
BLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3
LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 LC_MONETARY=en_US.UTF-8
[6] LC_MESSAGES=en_US.UTF-8 LC_PAPER=en_US.UTF-8 LC_NAME=C LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
time zone: Etc/UTC
tzcode source: system (glibc)
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] gtools_3.9.5 survminer_0.4.9 patchwork_1.2.0 ggpubr_0.6.0 survival_3.7-0 lubridate_1.9.4 forcats_1.0.1 stringr_1.6.0 dplyr_1.1.4
[10] purrr_1.2.0 readr_2.1.6 tidyr_1.3.1 tibble_3.3.0 ggplot2_4.0.1 tidyverse_2.0.0
loaded via a namespace (and not attached):
[1] gtable_0.3.6 bslib_0.9.0 xfun_0.54 rstatix_0.7.2 lattice_0.22-7 tzdb_0.5.0 vctrs_0.6.5
[8] tools_4.4.0 generics_0.1.4 pkgconfig_2.0.3 Matrix_1.7-4 data.table_1.17.8 RColorBrewer_1.1-3 S7_0.2.1
[15] lifecycle_1.0.4 compiler_4.4.0 farver_2.1.2 textshaping_1.0.4 carData_3.0-5 sass_0.4.10 htmltools_0.5.8.1
[22] yaml_2.3.10 jquerylib_0.1.4 crayon_1.5.3 pillar_1.11.1 car_3.1-2 cachem_1.1.0 abind_1.4-5
[29] km.ci_0.5-6 commonmark_2.0.0 tidyselect_1.2.1 digest_0.6.39 stringi_1.8.7 labeling_0.4.3 splines_4.4.0
[36] cowplot_1.1.3 rprojroot_2.1.1 fastmap_1.2.0 grid_4.4.0 cli_3.6.5 magrittr_2.0.4 broom_1.0.10
[43] withr_3.0.2 scales_1.4.0 backports_1.5.0 bit64_4.6.0-1 timechange_0.3.0 rmarkdown_2.30 ggtext_0.1.2
[50] bit_4.6.0 gridExtra_2.3 ggsignif_0.6.4 ragg_1.5.0 zoo_1.8-12 hms_1.1.4 evaluate_1.0.5
[57] knitr_1.50 KMsurv_0.1-5 markdown_1.13 survMisc_0.5.6 rlang_1.1.6 Rcpp_1.1.0 gridtext_0.1.5
[64] xtable_1.8-4 glue_1.8.0 xml2_1.5.0 rstudioapi_0.17.1 vroom_1.6.6 jsonlite_2.0.0 R6_2.6.1
[71] systemfonts_1.3.1